共计 1525 个字符,预计需要花费 4 分钟才能阅读完成。
ubuntu20.04 中实测有效,其他操作系统待验证
def find_mic_control(card_numbers):
cmd = ['amixer', '-c', card_numbers, 'contents']
output = subprocess.check_output(cmd).decode()
for line in output.splitlines():
if 'name=' in line and 'Mic Capture Volume' in line:
# 提取 numid=x
numid = int(line.split('numid=')[1].split(',')[0])
return numid
return None
def find_alsa_card_by_usb_id(vendor_product_id):
"""
根据 USB ID(格式为 xxxx:xxxx)查找 ALSA 声卡编号。:param vendor_product_id: USB ID,例如 '3634:4155'
:return: 对应的声卡编号列表(可能多个)"""
cards = []
base_path = '/proc/asound'
for entry in os.listdir(base_path):
full_path = os.path.join(base_path, entry)
# 确保是目录,并且是以 "card" 开头的目录(如 card0)if os.path.isdir(full_path) and entry.startswith('card'):
try:
card_number = entry.replace('card', '') # 提取数字部分
int(card_number) # 确保是数字
usbid_path = os.path.join(full_path, 'usbid')
if os.path.exists(usbid_path):
with open(usbid_path) as f:
usbid = f.read().strip().upper()
if vendor_product_id.upper() in usbid.upper():
cards.append(int(card_number))
except ValueError:
# 如果 card_number 不是数字,跳过
continue
return cards
usb_id = '3634:4155' # 注意:不带 USB 前缀
print(f"[INFO] Looking for ALSA sound card(s) matching USB ID: {usb_id}")
card_numbers = str(find_alsa_card_by_usb_id(usb_id)[0])
print(f"Found card_numbers={card_numbers}")
mic_numid = find_mic_control(card_numbers)
print(f"Found Mic Capture Volume at numid={mic_numid}")
subprocess.run(['amixer', '-c', card_numbers, '-M', 'cset', f'numid={mic_numid}', '0']) # 麦克风静音
正文完